﻿using System;

namespace SystemWnioskujacy
{
    public class QueryParameter : IComparable
    {
        public string Name = String.Empty;          // Tylko dla zmiennych
        private string[] vTab = new string [0];     // Dla stalej jest to jedna wartość, dla zmiennej może ich być dowolnie wiele lub zero (wtedy w wyniku zapytania podstawione zostaną wszystkie wartości spełniające warunek)
        public bool IsVar = false;                  // Jeśli parametr jest zmienną to może zmienić się w wyniku zapytania
        public int[] IDs = new int[0];

        public int Length
        {
            get
            {
                return vTab.Length;
            }
        }

        public string this[int i]
        {
            get
            {
                return vTab[i];
            }
        }

        public QueryParameter(string value)
        {
            AddValue(value);
        }

        public QueryParameter(string[] vTab)
        {
            this.vTab = vTab;
            this.IsVar = true;
        }

        public QueryParameter(string Name, string[] vTab)
        {
            this.Name = Name;
            this.vTab = vTab;
            this.IsVar = true;
        }

        public bool Exists(string value)
        {
            for (int i = 0; i < vTab.Length; i++)
            {
                if (vTab[i] == value) return true;
            }

            return false;
        }

        public void AddValue(string value)
        {
            if (!Exists(value))
            {
                string[] tab = new string[vTab.Length + 1];

                Array.Copy(vTab, tab, vTab.Length);
                tab[vTab.Length] = value;

                vTab = tab;
            }
        }

        public void SetValues(string[] Vs)
        {
            vTab = Vs;
        }

        public void RemoveValue(int i)
        {
            if (vTab.Length > i)
            {
                string[] ntab = new string[vTab.Length - 1];

                Array.Copy(vTab, ntab, i);
                Array.Copy(vTab, i + 1, ntab, i, vTab.Length - i - 1);

                vTab = ntab;
            }
        }

        public void RemoveValue(string value)
        {
            for (int i = 0; i < vTab.Length; i++)
            {
                if (vTab[i] == value)
                {
                    string[] ntab = new string[vTab.Length - 1];

                    Array.Copy(vTab, ntab, i);
                    Array.Copy(vTab, i + 1, ntab, i, vTab.Length - i - 1);

                    vTab = ntab;
                    break;
                }
            }
        }

        public void ClearValues()
        {
            vTab = new string[0];
        }

        public string[] Get()
        {
            return vTab;
        }

        public int CompareTo(object O)
        {
            if (O == null) return 1;

            QueryParameter QP = O as QueryParameter;
            if (QP != null)
            {
                string[] ST1 = this.Get();
                string[] ST2 = QP.Get();
                if (!ST1.Equals(ST2)) return 1;
            }
            else return 1;

            return 0;
        }
    }
}
